package jvm.VMExecSubsystem;

/**
 * 方法静态解析演示
 *  javap -verbose StaticResolution.class
 * @author msi
 */
public class StaticResolution {

    public static void sayHello() {
        System.out.println("hello world");
    }

    public final void finalHello() {
        System.out.println("hello world");
    }

    public static void main(String[] args) {
        new StaticResolution().finalHello(); //调用final修饰的方法的指令是 invokevirtual
        StaticResolution.sayHello();
    }

}
/**
 * 对class文件输入上面的指令显示
 *  1. invokespecial #1                  // Method java/lang/Object."<init>":()V    :调用实例构造器的字节码指令是invokespecial
 *  2. invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V  :调用println方法的指令是invokevirtual
 *  3. invokestatic  #5                  // Method sayHello:()V     :调用sayHello方法的指令是invokestatic
 *  4. invokevirtual #7                  // Method finalHello:()V   ：调用final修饰的方法的指令是 invokevirtual
 *  由于历史原因final修饰的方法是通过invokevirtual指令来调用的，但是其实这个方法也不能被重写。没有其他版本的可能，在《java虚拟机规范》中明确说明 : 被final修饰的方法是一种非虚方法。
 */

